#ifndef _APPLICATION_H_
#define _APPLICATION_H_

#include "ocwindow.h"

/**
 * Application文件
 * 用于创建引擎运行上下文
 * 创建程序运行窗口
 * 创建调试窗口
 * 管理整个引擎窗口和上下文
 * 
 */

/**
 * 应用程序类
 * 应用程序类是整个引擎的最高层类
 * 所有的子部件都受到应用程序类管理，包括窗口、资源加载、运行管线等
 * 
 */
class Application{
    public:

        //此函数必须在整个引擎运行前调用，以作一些初始化工作
        //否则引擎不能启动
        //成功初始化返回0，否则返回失败
        static int32 Initialize(int argc,char** argv,Application* app);
        //创建一个窗口
        //
        static void CreateWindow(const uString& caption,int32 width,int32 height,EWindowMode mode = EWindowMode::DESKTOP);

        //返回一个自引擎工作目录的资源搜寻路径
        static uString GetPath(const uString& path);

        Application();
        Application(const Application&)=delete;

        virtual ~Application();


        uBoolean isInitialized()const;
        uString getApplicationPath()const;


        //应用程序回调函数
        //应用程序回调函数是引擎运行时的钩子函数，用于在不同阶段对某一些数据做提前处理
        //不同的钩子函数在不同的阶段调用，应用程序确保其能够在正确的时机调用

        //onCreated是一个钩子函数，当初始化完毕以后会调用此函数
        virtual void onCreated();

        //onInput是一个钩子函数，当整个程序产生输入时会调用此函数
        virtual void onInput();
        
        //onDestroy是一个钩子函数，程序销毁前会调用此函数
        virtual void onDestroy();

    public:
        static UWindowBase* window;
        static uBoolean initialized;
        static uBoolean enableEditor;
        //程序的运行路径，该路径用于寻找其他需要资源
        static uString workPath;
    protected:
};

//CreateApplication 函数，用于创建一个可供运行的引擎程序
//该程序维护一个引擎运行环境
extern Application* CreateApplication();

#endif